import * as map from "./map.js"
function playerMove(direction) {
    //获取玩家的位置信息
    const playerInfo = getPlayerPosition();
    //获取运动之后的下一次的位置信息，传入方向/某个物体/此物体的定位-->就能确定他下一个的item是什么
    const nextInfo = nextItemInfo(direction, map.player, playerInfo.colIndex, playerInfo.rowIndex);
    if (nextInfo.item === map.wall) {
        //移动的下一个如果是墙，就不可以移动
        return;
    }
    //当前玩家的位置
    const currentInfo = nextInfo.lastItem;
    const nextNextInfo = nextItemInfo(direction, nextInfo.item, nextInfo.colIndex, nextInfo.rowIndex)
    if (nextInfo.item === map.box) {
        //判断下下个item的信息是不是墙或者箱子，如果是就不能推了
        if (nextNextInfo.item === map.wall || nextNextInfo.item === map.box) {
            return;
        }
        //移动的下一个如果是箱子，需要特殊处理
        //第一次改变，箱子和他后面的item交换
        exchangePosition(nextInfo, nextNextInfo)
        //再去获取更改后的下一个item相对于玩家的位置
        const newNextInfo = nextItemInfo(direction, map.player, playerInfo.colIndex, playerInfo.rowIndex);
        //第二次改变，玩家箱子交换之后的item进行交换
        exchangePosition(currentInfo, newNextInfo)
    } else {
        //如果剩下空白就直接交换
        exchangePosition(currentInfo, nextInfo)
    }
}
//交换这两个item的位置
function exchangePosition(current, next) {
    const temp = current.item;
    map.allMap[current.rowIndex][current.colIndex] = map.allMap[next.rowIndex][next.colIndex];
    map.allMap[next.rowIndex][next.colIndex] = temp;
}
//判断下一个的位置direction => 方向, item => 哪个item, itemColIndex => 此item的行的下标, itemRowIndex => 此item的列的下标
function nextItemInfo(direction, item, itemColIndex, itemRowIndex) {
    let itemInfo = null;
    //如果移动的是玩家，获取玩家的下一个方向的位置信息
    map.allMap.forEach((row, rowIndex) => {
        row.forEach((col, colIndex) => {
            //循环地图找出玩家当前位置
            if (col === item && itemColIndex === colIndex && itemRowIndex === rowIndex) {
                itemInfo = getItemNextPosition(direction, item, colIndex, rowIndex);
            }
        })
    })
    return itemInfo;
}
//获取玩家信息
function getPlayerPosition() {
    for (let row = 0; row < map.mapHeight; row++) {
        for (let col = 0; col < map.mapWidth; col++) {
            if (map.player === map.allMap[row][col]) {
                return {
                    rowIndex: row,
                    colIndex: col
                }
            }
        }
    }
}
// 通过方向，获得其下一个的信息
function getItemNextPosition(direction, item, colIndex, rowIndex) {
    if (direction === "R") {
        return {
            colIndex: colIndex + 1,
            rowIndex,
            item: map.allMap[rowIndex][colIndex + 1],
            lastItem: {
                colIndex,
                rowIndex,
                item: map.allMap[rowIndex][colIndex]
            }
        }
    } else if (direction === "L") {
        return {
            colIndex: colIndex - 1,
            rowIndex,
            item: map.allMap[rowIndex][colIndex - 1],
            lastItem: {
                colIndex,
                rowIndex,
                item: map.allMap[rowIndex][colIndex]
            }
        }
    } else if (direction === "U") {
        return {
            colIndex,
            rowIndex: rowIndex - 1,
            item: map.allMap[rowIndex - 1][colIndex],
            lastItem: {
                colIndex,
                rowIndex,
                item: map.allMap[rowIndex][colIndex]
            }
        }
    } else if (direction === "D") {
        return {
            colIndex,
            rowIndex: rowIndex + 1,
            item: map.allMap[rowIndex + 1][colIndex],
            lastItem: {
                colIndex,
                rowIndex,
                item: map.allMap[rowIndex][colIndex]
            }
        }
    }
}
//导出
export default playerMove;